﻿using DblogStudio.GUI.Common;
using DblogStudio.GUI.Utils;
using System;
using System.Windows.Forms;
using DblogStudio.GUI.DuLieu;
using DblogStudio.BLL;
using System.Diagnostics;

namespace DblogStudio.GUI
{
    public partial class FormMain : Form
    {
        private BaseUserControl GetActiveBaseUC()
        {
            try { return pnlMain.Controls[0] as BaseUserControl; }
            catch { return null; }
        }

        #region public static DAL.Models.NguoiSuDung NguoiSuDung {get; private set;} // Người dùng đang tác nghiệp
        /// <summary>
        /// Người sử dụng hiện tại của chương trình
        /// </summary>
        public static DAL.Models.AppUser NguoiSuDung { get; private set; }
        #endregion

        #region Chức năng Hệ thống

        private void tmrClientClock_Tick(object sender, EventArgs e)
        {
            lblClientDateTime.Text = System.DateTime.Now.ToString("dddd, dd/MM/yyyy - HH:mm");
        }

        public FormMain()
        {
            InitializeComponent();
            WireTrungEventHandlers();
            WireDungEventHandlers();

            DangXuat();
        }

        private void miHeThong_DangNhap_Click(object sender, EventArgs e)
        {
            var frm = new HeThong.FormDangNhap();
            if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                this.DangNhapTheo(frm.NguoiSuDung);
            }
        }

        public void DangXuat()
        {
            FormMain.NguoiSuDung = null;
            lblLoginStatus.Text = "Chưa đăng nhập";

            LoadUcWelcome();

            miHeThong_DangNhap.Visible = true;
            miHeThong_DangXuat.Visible = false;
            miHeThong_DoiMatKhau.Visible = false;
            miHeThong_QuanLyNguoiDung.Visible = false;
            miHeThong_PhanQuyen.Visible = false;
            miHeThong_NhatKyHoatDong.Visible = false;
            miHeThong_CauHinh.Visible = false;
            miDuLieu.Visible = false;
            lblHocKy.Visible = lnkXemDanhSachBaoTri.Visible = false;
        }

        public void LoadUcWelcome()
        {
            this.Text = "HỆ THỐNG THEO DÕI BẢO DƯỠNG";// - " + BizAppConfig.GetTENCONGTY();
            pnlMain.Controls.Clear();
            pnlMain.Controls.Add(new HeThong.UcWelcome() { Dock = DockStyle.Fill });
        }

        public void DangNhapTheo(DAL.Models.AppUser nguoiSuDung)
        {
            #region Cập nhật giao diện
            FormMain.NguoiSuDung = nguoiSuDung;
            lblLoginStatus.Text = string.Format("Đã đăng nhập ({0} - {1})",
                FormMain.NguoiSuDung.UserName, FormMain.NguoiSuDung.Role);
            var isAdmin = nguoiSuDung.Role == (int)VAITRO.Admin;

            /*
             * Phần quyền sử dụng hệ thống
             * Khi nào triển khai thì uncomment
             */
            var myItems = BizPhanQuyen.GetItems(this.msMain);
            var lsUser_Function = BizPhanQuyen.GetListByUser(nguoiSuDung.UserName);
            foreach (var item in myItems)
            {
                if (lsUser_Function.Contains(item.Text))
                    item.Visible = true;
                else
                    item.Visible = false;
            }


            /*
             * Dù có phần quyền như thế nào đi nữa thì những chức năng dưới vẫn phải theo quy tắc này
             */
            miHeThong.Visible = true;
            miHeThong_DangNhap.Visible = false;
            miHeThong_DangXuat.Visible = true;
            miHeThong_DoiMatKhau.Visible = true;
            miHeThong_Thoat.Visible = true;
            miTroGiup.Visible = true;
            miTroGiup_GioiThieuChuongTrinh.Visible = true;
            miTroGiup_HuongDan.Visible = true;
            miTroGiup_CapNhatPhanMem.Visible = true;
            lblHocKy.Visible = lnkXemDanhSachBaoTri.Visible = true;
            /*
             * Chỉ để thuận tiện cho việc test. Khi triển khai nhớ uncoomment
             */
            miHeThong_CauHinh.Visible = miHeThong_PhanQuyen.Visible = miHeThong_NhatKyHoatDong.Visible = miHeThong_QuanLyNguoiDung.Visible = isAdmin;

            /*
             * Khi triển khai thì comment những dòng sau
             */
            //miDuLieu.Visible = !isAdmin;
            //miDaoTao.Visible = !isAdmin;
            //miKhaoThi.Visible = !isAdmin;
            //miXetTotNghiep.Visible = !isAdmin;
            //lnkHocKy.Visible = !isAdmin;
            #endregion
        }

        private void miHeThong_DangXuat_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Bạn có chắc chắn muốn đăng xuất không?", "Chú ý", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
            {
                DangXuat();
            }
        }

        private void miHeThong_NhatKyHoatDong_Click(object sender, EventArgs e)
        {
            var dlg = new HeThong.FormNhatKyHoatDong();
            dlg.ShowDialog(this);
        }

        private void miHeThong_PhanQuyen_Click(object sender, EventArgs e)
        {
            var dlg = new HeThong.FormPhanQuyen(this.msMain);
            dlg.ShowDialog(this);
        }

        private void miHeThong_QuanLyNguoiDung_Click(object sender, EventArgs e)
        {
            var dlg = new HeThong.FormQuanLyNguoiDung();
            dlg.ShowDialog(this);
        }

        private void miHeThong_Thoat_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void miHeThong_DoiMatKhau_Click(object sender, EventArgs e)
        {
            var fdg = new DblogStudio.GUI.HeThong.FormDoiMatKhau(NguoiSuDung);
            fdg.ShowDialog();
        }

        private void miHeThong_CauHinh_Click(object sender, EventArgs e)
        {
            var fdg = new DblogStudio.GUI.HeThong.FormCauHinhHeThong();
            fdg.ShowDialog();
        }

        #endregion

        #region Chức năng Quản lý Dữ liệu
        private void miDuLieu_CongDoan_Click(object sender, EventArgs e)
        {
            var frm = new DuLieu.FormQuanLyCongDoanSanXuat();
            frm.ShowDialog();
        }

        private void miDuLieu_MayMoc_Click(object sender, EventArgs e)
        {
            var frm = new FormQuanLyMaySanXuat();
            frm.ShowDialog();
        }

        private void miDuLieu_BoPhanMay_Click(object sender, EventArgs e)
        {
            var frm = new FormQuanLyBoPhanMay();
            frm.ShowDialog();
        }

        private void miDuLieu_ChiTietMay_Click(object sender, EventArgs e)
        {
            var frm = new FormQuanLyChiTietMay();
            frm.ShowDialog();
        }

        private void miDuLieu_NhiemVuBaoTri_Click(object sender, EventArgs e)
        {
            var frm = new FormQuanLyNhiemVuBaoTri();
            frm.ShowDialog();
        }

        private void miDuLieu_LichSuBaoTri_Click(object sender, EventArgs e)
        {
            var frm = new FormLichSuBaoTri();
            frm.ShowDialog();
        }
        #endregion

        #region Trợ giúp

        private void miTroGiup_HuongDan_Click(object sender, EventArgs e)
        {
            try
            {
                System.Diagnostics.Process.Start("UserGuide.pdf");
            }
            catch (Exception ex)
            {
                MessageBox.Show("File UserGuide.pdf không được tìm thấy trong hệ thống. Chi tiết: " + ex.Message, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void miTroGiup_GioiThieuChuongTrinh_Click(object sender, EventArgs e)
        {
            var fdg = new DblogStudio.GUI.TroGiup.FormThongTinChuongTrinh();
            fdg.ShowDialog();
        }

        #endregion

        private void niMain_BalloonTipClosed(object sender, EventArgs e)
        {
            niMain.Visible = false;
        }

        public void Notify(string title, string message, int timeout = 5000, ToolTipIcon icon = ToolTipIcon.Info)
        {
            niMain.Icon = this.Icon;
            niMain.Visible = true;
            niMain.ShowBalloonTip(timeout, title, message, icon);
        }

        private void pnlMain_ControlRemoved(object sender, ControlEventArgs e)
        {

        }

        internal void CloseUcAndShowWelcome(BaseUserControl uc)
        {
            LoadUcWelcome();
            try { uc.Dispose(); }
            catch { }
        }

        private void FormMain_Resize(object sender, EventArgs e)
        {
            if (this.WindowState == FormWindowState.Minimized)
            {
                //FormResourcesViewer.MinimizeInstance();
                //FormLopHocPhan_ThoiKhoaBieu_KetQuaSaoChep.MinimizeInstance();
            }
            else
            {
                //FormResourcesViewer.RestoreInstance();
                //FormLopHocPhan_ThoiKhoaBieu_KetQuaSaoChep.RestoreInstance();
            }
        }

        private void lnkXemDanhSachBaoTri_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            var frm = new TacNghiep.FormDanhSachCanhBao();
            frm.ShowDialog();
        }

        private void miTroGiup_CapNhatPhanMem_Click(object sender, EventArgs e)
        {
            try
            {
                Process.Start("AutoUpdate.exe", System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name);
                Application.Exit();
            }
            catch (Exception ex)
            {
                DialogUtils.ShowError("Không tìm thấy file AutoUpdate.exe. Lỗi: " + ex.Message);
            }
        }
    }
}
